home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
—‹Œêsrc.lzh
/
fep.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-10
|
31KB
|
1,481 lines
#include "3DDEF.H"
#include "GLOBAL.H"
#include "FORWARD.H"
#include "XCODE.H"
#define FUSI_MAX 20
#define BS ('H'-'@')
extern WORD UNDER_FLAG;
extern int XF3_RUN;
extern UBYTE koho_10[10+1][MAXLINE];
extern UWORD koho_10x[10+1];
extern UWORD koho_max;
extern UBYTE XF_NEXT_BLOCK_KEY;
extern UBYTE XF_BEFORE_BLOCK_KEY;
extern UBYTE XF_RIGHT_KOHO_KEY;
extern UBYTE XF_LEFT_KOHO_KEY;
extern int kigou_or_code;
extern UBYTE f7_buff[32];
extern UBYTE ledpat;
WORD VERSION;
/* FEP のモード保持 */
/* "(Z:全角,H:半角) */
/* (K:カナ,-) */
/* (R:ローマ字入力,-)" */
/* (M:無変換,H:変換)" */
void
fep_mode_set(STR mode)
{
fep_mode_set0(mode);
strcpy(FP_MODE,mode);
disp_hmode();
}
void
fep_mode_set0(STR mode)
{
LEDMOD(6,mode[0] == 'Z');
LEDMOD(0,mode[1] == 'K');
LEDMOD(1,mode[2] == 'R');
LEDMOD(5,mode[4] == 'H');
}
void
fep_hmode_set(UBYTE c)
{
FP_MODE[3] = c;
}
/* キーバッファのクリア */
void
fep_key_clear()
{
if (DUM_FLAG) {
/* return;*/
while(INPOUT(0xff));
} else {
while(KNJCTRL(53));
}
}
UBYTE big_2byte[] = "あいうえおやゆよつアイウエオヤユヨツ";
UBYTE big_1byte[] = "アイウエオヤユヨツ";
/* 1文字入力 */
/* 0x0000 ~ 0xffff */
UINT
fep_inkey()/* ??? */
{
register UINT c,c_small;
register UWORD macro_command;
register UBYTE *p;
if (MACRO_EXE_FLAG) {
if (macro_command = MACRO_SEQUENCE[MACRO_COUNT++]) {
return(macro_command);
} else {
if (--MACRO_EXE_FLAG) {
MACRO_COUNT = 0;
return(MACRO_SEQUENCE[MACRO_COUNT++]);
}
}
}
head:
c = fep_inkey0();
/* UBYTE FP_MODE[16] = "Z-RHH"; FEP のモード保持 <= "(Z,H)(K,-)(R,-)(H,M)" */
if ((VERSION >= 300) && (fep_shift_ctrl() == 0x10)
/* SHIFT なら 0x10, CTRL なら 0x20 */
&& ((FP_MODE[1] == 'K') || (FP_MODE[2] == 'R'))) {
if (c && 0xff00) { /* 2バイト文字だ */
if (jstrchr(big_2byte,c)) { /* 含まれる */
c--;
}
} else { /* 1バイト文字だ */
if (p = strchr(big_1byte,c)) { /* 含まれる */
switch(*p) {
case 'ア':
c = 'ァ';break;
case 'イ':
c = 'ィ';break;
case 'ウ':
c = 'ゥ';break;
case 'エ':
c = 'ェ';break;
case 'オ':
c = 'ォ';break;
case 'ヤ':
c = 'ャ';break;
case 'ユ':
c = 'ュ';break;
case 'ヨ':
c = 'ョ';break;
case 'ツ':
c = 'ッ';break;
}
}
}
}
/*
{
UBYTE w[MAXLINE];
sprintf(w,"[%x]",c);
under_print(w);
}
*/
if (MACRO_DEF_FLAG) { /* マクロ定義中だ */
if (MACRO_COUNT >= MACRO_MAX_STEP-1) {
/* if (MACRO_COUNT >= 10) {*/
/* ストローク数が多すぎる */
MACRO_SEQUENCE[0] = 0;
MACRO_COUNT = MACRO_DEF_FLAG = 0;
under_print("[マクロ記録のステップが多すぎます:中断]");
etc_beep();
goto head;
} else {
MACRO_SEQUENCE[MACRO_COUNT++] = c;
}
}
return(c);
}
/* 1文字入力 */
/* 0x0000 ~ 0xffff */
UINT
fep_inkey0()/* ??? */
{
register UINT c;
UINT q_func;
if (c = fep_buffer) {
fep_buffer = 0;
return(c);
}
if (kigou_or_code) {
if (kigou_or_code == 1) { /* 記号入力 */
return(xf_kigou()); /* ,,, */
} else { /* コード入力 */
return(xf_code_input());
}
}
/*etc_beep();*/
while(1) {
if (c = fep_INKEY()) { /* 何か入力があった */
return(c);
} else if (q_func = fep_qxf()) { /* XF もしくはファンクションキーである */
etc_while_fep_qxf();
etc_click();
return(q_func);
}
}
}
/* 7 6 5 4 3 2 1 0 */
/* A [XF3] [XF2] [XF1] [HELP] [登録] [記号] [.] [,] */
/* B [ひらがな] [INS] [CAPS] [コード] [ローマ字] [かな] [XF5] [XF4] */
/*
[HELP]=6
[登録]=7
[記号]=8
[ひらがな]=9
[INS]=A
[CAPS]=B
[コード]=C
[ローマ字]=D
[かな]=E
*/
/* ファンクションキーが押されたか? */
/* マウスもサポート */
UINT
fep_qxf2()
{
register int k0,k1 = 0,ks,i;
if ((k0 = BITSNS(0x0c) & 0b11111001) || (k1 = (BITSNS(0x0d) & 0b00011111))) {
if (k0 & 1) { /* [全角] */
return(0x10f); /* シフトの類は無視する */
}
k0 = (k0 >> 3) | (k1 << 5);
for(i = k1 = 1;i <= 10;i++,k1 <<= 1) {
if (k0 & k1) { /* 絶対途中でBREAKする */
break;
}
}
if (ks = (BITSNS(0x0e) & 0b00000011)) { /* SHIFT, CTRL */
if (ks & 1) {
return(i + 0x210); /* SHIFT */
} else {
return(i + 0x220); /* CTRL */
}
}
return(i+0x200);
} else {
if (MS_GETDT() & 0b00000000000000001111111100000000) {
return(0x210); /* 左ボタンが押された */
}
return(0);
}
}
/* XFキーが押されたか? */
UINT
fep_qxf()
{
register int k;
if ((!DUM_FLAG) && (B_BPEEK(fep_p2) != fep_p2_last)) {
return(0);
}
if (k = BITSNS(6)) {
if (k & 0b10000000) {
k = 0;/*FEP_DEL_CODE;*/
} else if (k & 0b01000000) {
k = FEP_HOME_CODE;
} else {
k = 0;
}
} else if (k = BITSNS(7)) {
if (k & 0b10000000) {
k = FEP_CLR_CODE;
} else if (k & 0b01000000) {
k = 0;/*FEP_DNARROW_CODE;*/
} else if (k & 0b00100000) {
k = 0;/*FEP_RIGHTARROW_CODE;*/
} else if (k & 0b00010000) {
k = 0;/*FEP_UPARROW_CODE;*/
} else if (k & 0b00001000) {
k = 0;/*FEP_LEFTARROW_CODE;*/
} else if (k & 0b00000100) {
k = FEP_UNDO_CODE;
} else if (k & 0b00000010) {
k = 0;/*FEP_ROLLDN_CODE;*/
} else if (k & 0b00000001) {
k = 0;/*FEP_ROLLUP_CODE;*/
}
} else if (k = (BITSNS(0x0a) & 0b11111100)) { /* XF1-5 */
if (k & 0b00100000) k = FEP_XF1_CODE;
else if (k & 0b01000000) k = FEP_XF2_CODE;
else if (k & 0b10000000) k = FEP_XF3_CODE;
else if (k & 0b00010000) k = FEP_HELP_CODE;
else if (k & 0b00001000) k = FEP_TOUROKU_CODE;
else k = FEP_KIGOU_CODE;
} else if (k = (BITSNS(0x0b))) {
if (k & 0b00000001) k = FEP_XF4_CODE;
else if (k & 0b00000010) k = FEP_XF5_CODE;
else if (k & 0b00000100) k = FEP_KANA_CODE;
else if (k & 0b00001000) k = FEP_ROMA_CODE;
else if (k & 0b00010000) k = FEP_CODE_CODE;
else if (k & 0b00100000) k = 0;/*FEP_CAPS_CODE;*/
else if (k & 0b01000000) k = FEP_INS_CODE;
else if (k & 0b10000000) k = 0;/*FEP_HIRAGANA_CODE;*/
}
if (!k) {
return(fep_qxf2());
}
return(k + fep_shift_ctrl());
}
/* SHIFT なら 0x10, CTRL なら 0x20 */
int
fep_shift_ctrl()
{
register int ks;
if (ks = (BITSNS(0x0e) & 0b00000011)) { /* SHIFT, CTRL */
if (ks & 1) {
return(0x10); /* SHIFT */
} else {
return(0x20); /* CTRL */
}
} else {
return(0);
}
}
void
fep_push_key(UINT c)
{
if (MACRO_EXE_FLAG) {
MACRO_COUNT--;
return;
}
if (fep_buffer) {
error("バグです1");
} else {
fep_buffer = c;
}
}
UINT
fep_under_inkey()
{
return(fep_inkey());
}
UINT
fep_get_key()
{
register UINT c;
if (c = fep_INKEY()) { /* 何か入力があった */
if ((c < 0x20) || isprkana(c)) {
return(c);
/* コントロールコード、もしくは普通の1バイトコード */
} else {
if (c <= 0x80) {
c = (c << 8) | fep_INKEY();
}
return(c);
}
} else {
return(0);
}
}
/* i == 0 ならなんでも入力 */
/* さもなくばコマンドの2バイト目として判断して返す */
UINT
fep_inkey_command(i)
{
if (i) { /* 「半角英数字の大文字」or「コントロールコード」に決め込む */
return(fep_inkey_raw());
} else {
return(fep_inkey());
}
}
/* 1文字入力 */
/* 0x00 ~ 0xff */
/* 一時的にモードを解除して、キーボードより入力する */
UINT
fep_inkey_raw_not_code()
{
UINT c;
UINT mode;
mode = K_SFTSNS();
fep_ledset(0);
fep_mode_set0((STR)"H--M");
while(1) {
if (c = fep_qxf()) { /* XF もしくはファンクションキーである */
/* etc_while_fep_qxf();*/
break;
} else if (c = fep_INKEY()) { /* 何か入力があった */
if ((c < 0x20) || (isprkana(c))) {
break; /* 普通の1バイトコード */
}
} else if (K_SFTSNS() & 0b1000000) {
c = 0x10c;
break;
}
}
fep_mode_set(FP_MODE);
fep_ledset(mode);
return(toupper(c));
}
/* 1文字入力 */
/* 0x00 ~ 0xff */
/* 一時的にモードを解除して、キーボードより入力する */
UINT
fep_inkey_raw0()
{
UINT c;
UINT mode;
mode = K_SFTSNS();
fep_ledset(0);
/* fep_mode_set0((STR)"H--M");*/
while((c = fep_inkey()) >= 0x8000); /* 全角はチャイ */
/* fep_mode_set(FP_MODE);*/
fep_ledset(mode);
return(toupper(c));
}
/* 1文字入力 */
/* 0x00 ~ 0xff */
/* 一時的にモードを解除して、キーボードより入力する */
UINT
fep_inkey_raw()
{
UINT c;
UINT mode;
mode = K_SFTSNS();
fep_ledset(0);
fep_mode_set0((STR)"H--M");
while((c = fep_inkey()) >= 0x8000); /* 全角はチャイ */
fep_mode_set(FP_MODE);
fep_ledset(mode);
return(toupper(c));
}
UBYTE fep_func_save[712]; /* ファンクションキーの保存 */
void
fep_init_first()
{
FNCKEYGT(0,fep_func_save);
}
void
fep_init()
{
register UINT pcon;
UBYTE isask[] = "CON ASK68KV2";
UINT i,a0;
fep_buffer = 0;
if (!DUM_FLAG) {
KNJCTRL(7,0); /* ロックする */
} else {
KNJCTRL(7,1);
}
/*init_exit();etc_exit(0);*/
FIRST_FP_MODE = KNJCTRL(6); /* 入力モードを読み出す */
/*init_exit();etc_exit(0);*/
fep_mode_set(FP_MODE); /* 全角、ひらがな、ローマ字、変換 or "HKRH" */
strcpy(FP_MODE_HEN,FP_MODE);
strcpy(FP_MODE_MUHEN,"H--MH");
strcpy(FP_MODE_MUHEN_0,FP_MODE_MUHEN);
/*init_exit();etc_exit(0);*/
pcon = etc_get_last_con();
/*window0();printf("[%x]",pcon);binkey();*/
a0 = pcon+0xe;
for(i=0;i<16;i++,a0++) {
if (B_BPEEK(a0) != isask[i]) {
break;
}
}
if (i != 16) { /* ask.sys */
if ((VERSION = KNJCTRL(50)) < 300) { /* Ver 2.XX */
fep_p1 = pcon + 0x4e5bf - 0x332b4;
fep_p2 = pcon + 0x4e5c1 - 0x332b4;
fep_pr = pcon + 0x51b56 - 0x332b4;
} else { /* Ver 3.XX */
fep_p1 = pcon + 0x47a0b - 0x332b4;
fep_p2 = pcon + 0x47a0b - 0x332b4;
fep_pr = pcon + 0x47a0b - 0x332b4;
}
} else { /* ask.x */
/*error("ask.x");*/
fep_p1 = pcon + 0x8c5e3 - 0x71780;
fep_p2 = pcon + 0x8c5e5 - 0x71780;
fep_pr = pcon + 0x8fb7a - 0x71780;
}
/*
window0();
printf("[%x][%x][%x]",fep_p1,fep_p2,fep_pr);
binkey();
*/
if (!DUM_FLAG) {
fep_p2_last = B_BPEEK(fep_p2);
}
}
fep_init_exit()
{
fep_key_clear();
FNCKEYST(0,fep_func_save);
KNJCTRL(5,FIRST_FP_MODE); /* 入力モードを戻す */
xf_dic_flush();
KNJCTRL(7,1); /* アンロック */
}
UBYTE left[VERY_LONG_LINE],right[VERY_LONG_LINE];/*,right_r[MAXLINE];*/
int leftc,rightc;
int XF3_RUN;
UINT under_first_x;
/* ^Q 対応の1行入力 */
/* 指定された終了文字を返す */
/* エコーする */
/* max はエコー幅 */
UINT
fep_input_cr(STR s,int max,STR terminal)
{
return(fep_input_esc0(s,max,terminal,0));
}
/* ^Q 対応の1行入力 */
/* 指定された終了文字を返す */
/* エコーする */
/* max はエコー幅 */
/* ^G で終了したなら -1 を返す */
UINT
fep_input_esc(STR s,int max,STR terminal)
{
return(fep_input_esc0(s,max,terminal,1));
}
/* ^Q 対応の1行入力 */
/* 指定された終了文字を返す */
/* エコーする */
/* max はエコー幅 */
/* ^G で終了したなら -1 を返す */
/* mode が 1 なら ESC で帰る、さもなくば CR で帰る */
UINT
fep_input_esc0(STR s,int max,STR terminal,int mode)
{
UWORD ec;
int flag;
UINT c,c0;
STR p;
int x;
*left = *right = EOS;
leftc = rightc = 0; /* バッファカウンタを初期化 */
disp_cursor_on(); /* カーソルを出す */
disp_show_cursor(); /* カーソルのブリンクを強制的にオンにする */
while(1) {
c = fep_input_char(terminal,&ec);
switch(ec) {
case 'H'-'@': /* ^H である */
if (rightc) {
c = etc_jlast(right); /* 最後の文字 */
} else if (leftc) {
c = etc_jlast(left); /* 最後の文字 */
} else { /* 最後の文字がない */
continue; /* 何もしない */
}
if (mode && (c == CR)) {
fep_input_minus(1); /* 1バイトバッファから削る */
} else {
fep_input_minus(etc_char_byte_len(c));
}
fep_input_flush_bs();
continue;
case '_'-'@': /* ^_ = [CLR] である */
case 'U'-'@': /* ^U である */
*right = *left = EOS;
rightc = leftc = 0;
xf_init_tb_r();
fep_input_flush();
continue;
case '['-'@': /* ESC である */
if (mode) {
/* 普通に終了 */
strcpy(s,left);
strcat(s,right);
return(ec);
} else {
return(-1);
}
case 'M'-'@': /* CR である */
case 'J'-'@': /* CR である */
if (rightc || TBUFFC_R) {
goto ikinari_kakutei;
}
if (!mode) {
/* 普通に終了 */
strcpy(s,left);
strcat(s,right);
xf_cat_r_init(s,TBUFF_R);
/* strcat(s,TBUFF_R);*/
/* xf_init_tb_r();*/
return(ec);
}
break;
continue;
case 'G'-'@': /* ^G である */
/* 無効で終了 */
return(-1);
continue;
default:
break;
}
if (((rightc + leftc) >= max) || (!c)) {
etc_beep();
continue;
}
if (xf_check(c)) {
fep_input_flush(); /* カーソルをちゃんと戻す */
}
switch(c) {
int i;
case 0x103: /* 変換開始 */
for(i=0;i<SEG_MAX;i++) {
SEG_FLAG[i] = 0;
}
if (FP_MODE[3] != 'H') { /* 変換モードでない */
break;
}
if (!rightc) { /* 変換する対象がない */
break;
}
XF3_RUN = 0;
xf_cat_r_init(right,TBUFF_R);
/* strcpy(right_r,right);*/ /* 保存しておく */
kcount = KNJCTRL(19,right,kc,k1); /* 19=変換開始 */
fnumber = 0; /* 文節番号 */
SEG[fnumber][0] = EOS;
knumber = 1; /* 候補番号 */
bnumber = 0; /* ブロック番号 */
fep_xf_disp_1l(fnumber,kc,k1);
do {
c0 = fep_inkey_raw();
flag = fep_xf0_1l(c0);
} while(!flag);
break;
case 0x104: /* かな/カナ変換 */
/* RAW color のまま変換する */
/* かなに戻せばかな漢字変換可能 */
xf_cat_r_init(right,TBUFF_R);
if (FP_MODE[3] != 'H') { /* 変換モードでない */
break;
}
p = right;
while(1) {
p = etc_jfirst_x(p,&c0);
if (!p) break; /* かな/カナが見付からなかった */
if (jiskata(c0)) {
etc_zen_kata_to_hira(right,right,MAXLINE);
break;
} else if (jishira(c0)) {
etc_zen_hira_to_kata(right,right,MAXLINE);
break;
}
/* 続行 */
}
fep_xf_disp_right(); /* 右側を新たに書く */
etc_while_fep_qxf(); /* 離されるまで待つ */
break;
case TAB:
case CR:
case 'M'-'@':
if ((!rightc)&&(!TBUFFC_R)) { /* 生入力がない */
goto normal_input;
}
case 0x105: /* いきなり全文確定 */
ikinari_kakutei:
fep_under_ikinari_kakutei();
#if 0
strcat(left,right);
xf_cat_r_init(left,TBUFF_R);
/* strcat(left,TBUFF_R);*/
/* xf_init_tb_r();*/
right[rightc = 0] = EOS;
fep_xf_disp_left();
leftc = strlen(left);
/* under_blanc();*/
etc_while_fep_qxf(); /* 離されるまで待つ */
#endif
break;
case 0x122: /* CTRL+XF2 左側を確定 */
if (FP_MODE[3] != 'H') { /* 変換モードでない */
break;
}
break;
case 0x114: /* SHIFT+XF4 全角/半角変換 */
xf_cat_r_init(right,TBUFF_R);
if (FP_MODE[3] != 'H') { /* 変換モードでない */
break;
}
p = right;
p = etc_jfirst_x(p,&c0);
if (!p) break; /* かな/カナが見付からなかった */
if (c0 > 0x100) { /* 全角ってことで */
etc_str_zen_to_han(right,right,MAXLINE);
} else {
etc_str_han_to_zen(right,right,MAXLINE);
}
rightc = strlen(right);
fep_xf_disp_right(); /* 右側を新たに書く */
B_PRINT("\x1b[0K");
etc_while_fep_qxf(); /* 離されるまで待つ */
break;
case 0x1ff:
if (TBUFFC_R) {
fep_input_flush();
} else {
fep_input_flush_bs();
}
break;
default:
normal_input:
/* 幅チェック */
if ((c < 0x100) || (c >= 0x8000)) { /* 普通の文字である */
fep_input_add(c);
fep_input_flush();
break;
}
}
}
}
void
fep_xf_disp_convert(STR s,STR d)
{
UBYTE w[VERY_LONG_LINE];
register int i = 0;
register UBYTE c;
while(c = *s++) {
if (c == CR) {
w[i++] = '<';
w[i++] = 'N';
w[i++] = 'L';
w[i++] = '>';
} else if (c == TAB) {
w[i++] = '^';
w[i++] = 'I';
} else {
w[i++] = c;
}
}
w[i] = EOS;
cut_disp_convert(w,d,CURRENT_JIZUME);
}
void
fep_xf_disp_left()
{
window_abs_loc(under_first_x,UNDER_Y);
fep_xf_disp_1(left);
}
void
fep_xf_disp_right()
{
fep_xf_disp_left();
etc_color(RAW);
fep_xf_disp_1(right);
etc_color(NORMAL);
}
void
fep_xf_disp_1(STR l)
{
UBYTE d[VERY_LONG_LINE];
fep_xf_disp_convert(l,d);
B_PRINT(d);
}
/* 指定されたバイト数をバッファから削る */
/* EOS を埋め込むことを忘れずに */
void
fep_input_minus(int i)
{
if (rightc) {
if (rightc >= i) {
rightc -= i; /* right だけで間に合った */
right[rightc] = EOS;
return;
} else {
i -= rightc;
rightc = 0; /* left に食い込む */
*right = EOS;
}
}
if (left) {
if (leftc >= i) {
leftc -= i; /* left だけで間に合った */
left[leftc] = EOS;
return;
} else {
error("バグです2");
}
}
}
/* 1ライン変換表示 */
/* の2点に挟まれた間を表示する */
/* fn が現在作業中の文節 */
void
fep_xf_disp_1l(int fn,STR kc,STR k1)
{
UBYTE f0[TBUFF_SIZE];
register int i;
window_abs_loc(under_first_x,UNDER_Y);
fep_xf_disp_left(); /* 変換の対象になっていない左を表示する */
*f0 = EOS;
for(i=0;i<fn;i++) {
strcat(f0,SEG[i]);
} /* 半確定の文節をひとつにまとめる */
/* era_box * 3 が無駄 */
if (*f0) {
etc_color(OFUSI);
fep_xf_disp_1(f0);
}
etc_color(CFUSI);
fep_xf_disp_1(kc);
if (*k1) {
etc_color(OFUSI);
fep_xf_disp_1(k1);
}
etc_color(NORMAL);
B_PRINT("\x1b[0K"); /* 文字列が短くなっている可能性があるので右側を消す */
/* etc_while_fep_qxf();*/ /* 離されるまで待つ */
}
/* 文字を追加する */
void
fep_input_add(UINT c)
{
UBYTE c0,c1;
UWORD cd;
if ((c == L'゜') || (c == L'゛')) {
if (rightc) {
cd = etc_jlast(right); /* 最後の文字 */
} else if (leftc) {
cd = etc_jlast(left); /* 最後の文字 */
} else { /* 最後の文字がない */
goto fep_inpu_add_ok;
}
if ((c == L'゛') && (etc_dakuten_able_under(cd))) {
fep_input_minus(etc_char_byte_len(cd));
fep_input_add(cd+1);
return;
}
if ((c == L'゜') && (etc_handakuten_able_under(cd))) {
fep_input_minus(etc_char_byte_len(cd));
fep_input_add(cd+2);
return;
}
}
fep_inpu_add_ok:
if (c >= 0x100) { /* 2バイト文字である */
c0 = (c >> 8);
c1 = c & 0xff;
} else {
c0 = c;
c1 = 0;
}
if (FP_MODE[3] == 'H') { /* 変換モードである */
right[rightc++] = c0;
if (c1) {
right[rightc++] = c1;
}
right[rightc] = EOS;
} else { /* 変換モードでない */
left[leftc++] = c0;
if (c1) {
left[leftc++] = c1;
}
left[leftc] = EOS;
}
}
/* 一行クリアしてから */
/* アンダー入力をフラッシュする */
void
fep_input_flush_bs()
{
etc_color(NORMAL);
fep_input_flush();
}
/* アンダー入力をフラッシュする */
void
fep_input_flush()
{
UBYTE d[VERY_LONG_LINE];
etc_color(NORMAL);
fep_xf_disp_convert(left,d);
window_abs_loc(under_first_x,UNDER_Y);
B_PRINT(d);
etc_color(RAW);
fep_xf_disp_convert(right,d);
B_PRINT(d);
xf_disp_tb_r_under();
etc_color(NORMAL);
B_PRINT("\x1b[0K");
}
/* ^Q 対応の1文字入力 */
UINT
fep_input_char(STR terminal,UWORD *endcode)
{
UINT c;
*endcode = EOS;
if ((c = fep_inkey()) == (QUOTE)) { /* ^Q なら */
return(fep_inkey()); /* 次の1バイトは無条件 */
} else {
if (c < 0x100) {
if (strchr(terminal,c)) { /* 終了条件 */
*endcode = c;
return(0);
}
if (c == 'M'-'@') { /* ^M なら */
c = CR; /* 改行にすりかえる */
} else if (c == 'H'-'@') { /* ^H なら */
*endcode = c;
}
}
return(c);
}
}
/* 1ライン変換実行 */
int
fep_xf0_1l(int c)
{
int w;
short ws;
UBYTE kc0[TBUFF_SIZE];
int knumber0;
int kohox;
switch(c) {
case 0x1ff:
return(0);
case 0x101: /* XF1:前文節へ */
if (fnumber > 0) {
etc_func_on();
kcount = KNJCTRL(35,kc,k1); /* 35=前文節への移動 */
fnumber--;
knumber = 1; /* 候補番号 */
bnumber = 0; /* ブロック番号 */
XF3_RUN = 0;
fep_xf_disp_1l(fnumber,kc,k1);
}
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': /* 数値選択をして次候補 */
knumber = c -'0';
if ((knumber < koho_max) && (XF3_RUN >= 2)) {
strcpy(kc,koho_10[knumber]);
/* break しない */
} else {
etc_beep();
break;
}
case 0x102: /* 次文節へ */
strcpy(SEG[fnumber],kc);
if (w = KNJCTRL(25,knumber,kc0,kc,k1,&ws)) {
etc_func_on();
if (kcount = ws) {
fnumber++;
knumber = 1; /* 候補番号 */
bnumber = 0; /* ブロック番号 */
XF3_RUN = 0;
fep_xf_disp_1l(fnumber,kc,k1);
} else { /* 次の候補がない=最後の文節である */
strcpy(kc,SEG[fnumber]);
goto kakutei;
}
} else {
etc_beep();
}
break;
case 0x103: /* 次候補:XF0 だから */
migikoho:
switch (XF3_RUN) {
case 0:
/* 通常次候補 */
/* 無条件に第一ブロック */
XF3_RUN++;
if (KNJCTRL(21,kc,k1)) { /* 21=候補群ブロック内の次候補を得る */
/* すんなり見付かった */
knumber++;
fep_xf_disp_1l(fnumber,kc,k1);
break;
} else { /* 候補1個だけで、数値選択モード突入 */
} /* 底抜けだよーん */
case 1:
/* 数値選択状態突入 */
etc_func_off(); /* ファンクションキーの表示を消す */
knumber0 = knumber;
while(knumber0 != 1) { /* 戻る */
knumber0--;
w = KNJCTRL(20,kc,k1); /* 20=候補群ブロック内の前候補を得る */
}
knumber++;
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
if (!*koho_10[knumber]) { /* 数字選択状態突入と同時に候補が無ければ */
/* 2つの候補だけ表示する */
knumber = 1;
}
disp_koho_block(knumber);
strcpy(kc,koho_10[knumber]);
fep_xf_disp_1l(fnumber,kc,k1);
XF3_RUN++;
break;
case 2:
default:
/* 数字選択状態継続 */
knumber0 = knumber++;
if (*koho_10[knumber]) { /* ある */
kohox = koho_10x[knumber0];
if (disp_koho(knumber0,knumber,&kohox,koho_10[knumber0])) {
/* 表示しきれない */
}
/* kohox = koho_10x[knumber];*/
if (disp_koho(knumber,knumber,&kohox,koho_10[knumber])) {
/* 表示しきれない */
}
strcpy(kc,koho_10[knumber]);
fep_xf_disp_1l(fnumber,kc,k1);
} else { /* もうない */
if (KNJCTRL(23,kc,k1)) { /* 次候補ブロックの作成 */
/* あった */
bnumber++;
} else { /* 無かった */
while(KNJCTRL(22,kc,k1)); /* 前候補ブロックの作成 */
/* 最初まで遡る */
bnumber = 0;
}
knumber = 1;
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
if (!*koho_10[knumber]) {
knumber = 1;
}
disp_koho_block(knumber);
strcpy(kc,koho_10[knumber]);
fep_xf_disp_1l(fnumber,kc,k1);
}
break;
}
break;
case 0x114: /* 半角/全角変換 */
KNJCTRL(37,kc,k1); /* 37=先頭文節をカタカナにする */
if (SEG_FLAG[fnumber]) {
etc_str_han_to_zen(kc,kc,MAXLINE); /* 先頭文節を全角にする */
SEG_FLAG[fnumber] = 0;
fep_xf_disp_1l(fnumber,kc,k1);
} else {
etc_str_zen_to_han(kc,kc,MAXLINE); /* 先頭文節を半角にする */
SEG_FLAG[fnumber] = 1;
fep_xf_disp_1l(fnumber,kc,k1);
B_PRINT("\x1b[0K");
}
XF3_RUN = 0;
etc_func_on();
etc_while_fep_qxf(); /* 離されるまで待つ */
break;
case 0x104: /* ひらがな/カタカナ変換 */
/* 最初はとにかく「ひらがな」へ */
/* その後はトグル */
if (etc_is_there_han2byte(kc)) {
etc_beep();
under_print("現在の状態ではひらがな⇔カタカナ変換はできません");
break;
}
if (SEG_FLAG[fnumber]) {
w = KNJCTRL(37,kc,k1); /* 37=先頭文節をカタカナにする */
SEG_FLAG[fnumber] = 0;
} else {
w = KNJCTRL(38,kc,k1); /* 38=先頭文節をひらがなにする */
SEG_FLAG[fnumber] = 1;
}
XF3_RUN = 0;
etc_func_on();
fep_xf_disp_1l(fnumber,kc,k1);
etc_while_fep_qxf(); /* 離されるまで待つ */
break;
case TAB:
case 'M'-'@':
case CR:
case 0x105: /* 全体確定 */
kakutei:
etc_func_on();
if (XF3_RUN >= 2) { /* 数字選択状態だった */
UBYTE d1[MAXLINE],d2[MAXLINE];
w = KNJCTRL(25,knumber,kc,d1,d2,&ws);
}
{
UBYTE tlast[MAXLINE];
int i;
for(i=0;i<fnumber;i++) {
strcat(left,SEG[i]);
} /* 半確定の文節をひとつにまとめる */
strcat(left,kc);
strcat(left,k1);
w = KNJCTRL(24,tlast); /* 全体確定 */
/* 変換後が長すぎる場合の切り詰めを検出できないので tlast はダミー */
}
xf_init_tb_r();
right[rightc = 0] = EOS;
fep_xf_disp_left();
leftc = strlen(left);
xf_init_tb();
B_PRINT("\x1b[0K");
/* under_blanc();*/
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
case 0x111: /* 文節を短くする */
etc_func_on();
w = KNJCTRL(34,kc,k1); /* 34=先頭文節を1文字短くして再変換 */
XF3_RUN = 0;
fep_xf_disp_1l(fnumber,kc,k1);
break;
case 0x112: /* 文節を長くする */
etc_func_on();
w = KNJCTRL(33,kc,k1); /* 33=先頭文節を1文字長くして再変換 */
XF3_RUN = 0;
fep_xf_disp_1l(fnumber,kc,k1);
break;
case '['-'@': /* キャンセル */
etc_func_on();
fep_xf_disp_right();
etc_while_fep_qxf(); /* 離されるまで待つ */
return(2);
break;
default:
if (c == XF_NEXT_BLOCK_KEY) { /* 次候補ブロックへ */
knumber = 1;
if (KNJCTRL(23,kc,k1)) { /* 次候補ブロックの作成 */
bnumber++;
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
}
strcpy(kc,koho_10[knumber]);
disp_koho_block(knumber);
fep_xf_disp_1l(fnumber,kc,k1);
break;
}
if (c == XF_BEFORE_BLOCK_KEY) { /* 前候補ブロックへ */
knumber = 1;
if (bnumber) {
bnumber--;
maeblock:
KNJCTRL(22,kc,k1); /* 前候補ブロックの作成 */
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
}
strcpy(kc,koho_10[knumber]);
disp_koho_block(knumber);
fep_xf_disp_1l(fnumber,kc,k1);
break;
}
if (c == XF_RIGHT_KOHO_KEY) { /* 右候補へ */
goto migikoho;
/* break;*/
}
if (c == XF_LEFT_KOHO_KEY) { /* 左候補へ */
/* 数字選択状態にして左候補へ */
if (XF3_RUN >= 4) { /* すでに数字選択状態だった */
if (knumber > 1) { /* 前候補ブロックに行かなくてもよい */
knumber0 = knumber--;
kohox = koho_10x[knumber];
if (disp_koho(knumber,knumber,&kohox,koho_10[knumber])) {
/* 表示しきれない */
}
if (disp_koho(knumber0,knumber,&kohox,koho_10[knumber0])) {
/* 表示しきれない */
}
} else { /* 前候補ブロックへ行く */
if (bnumber) { /* 前ブロックがあるはず */
bnumber--;
knumber = 9;
goto maeblock; /* 前候補ブロックへ */
}
}
} else { /* まだ数字選択状態ではない */
knumber0 = knumber;
if (knumber > 1) {
knumber--;
}
XF3_RUN = 5; /* フラグみたいなもの */
etc_func_off(); /* ファンクションキーの表示を消す */
while(knumber0 != 1) { /* 戻る */
knumber0--;
w = KNJCTRL(20,kc,k1); /* 20=候補群ブロック内の前候補を得る */
}
strcpy(koho_10[1],kc); /* 最初は1 */
knumber0 = 2;
while(1) {
if (KNJCTRL(21,kc,k1)) {
strcpy(koho_10[knumber0++],kc);
} else {
koho_10[knumber0][0] = EOS;
koho_max = knumber0;
break;
}
}
disp_koho_block(knumber);
}
strcpy(kc,koho_10[knumber]);
fep_xf_disp_1l(fnumber,kc,k1);
break;
}
/* スペース以外の普通の文字 -> 全体を確定して、プッシュ */
etc_func_on();
w = KNJCTRL(24,right); /* 全体確定 */
strcat(left,right);
leftc += rightc;
rightc = 0;
fep_xf_disp_left();
etc_while_fep_qxf(); /* 離されるまで待つ */
xf_init_tb();
fep_push_key(c);
etc_while_fep_qxf(); /* 離されるまで待つ */
return(1);
break;
}
fep_key_clear();
etc_while_fep_qxf(); /* 離されるまで待つ */
return(0);
}
/* 全角 ひらがな INS CAPS コード ローマ かな */
/* 全角 ひらがな INS CAPS コード ローマ かな opt2 opt1 ctrl shift */
void
fep_follow_led()
{
if ((FP_MODE[0] == 'Z') && (!(K_SFTSNS() & 0b10000000000))) {
LEDMOD(6,1);
}
if ((FP_MODE[0] != 'Z') && (K_SFTSNS() & 0b10000000000)) {
LEDMOD(6,0);
}
if ((FP_MODE[2] == 'R') && (!(K_SFTSNS() & 0b00000100000))) {
LEDMOD(1,1);
}
if ((FP_MODE[2] != 'R') && (K_SFTSNS() & 0b00000100000)) {
LEDMOD(1,0);
}
if ((FP_MODE[1] == (UBYTE)'K') && (!(K_SFTSNS() & 0b00000010000))) {
LEDMOD(0,1);
}
if ((FP_MODE[1] != (UBYTE)'K') && (K_SFTSNS() & 0b00000010000)) {
LEDMOD(0,0);
}
}
/* 全角 ひらがな INS CAPS コード ローマ かな */
/* 全角 ひらがな INS CAPS コード ローマ かな opt2 opt1 ctrl shift */
void
fep_follow_led0()
{
LEDMOD(6,(FP_MODE[0] == 'Z'));
LEDMOD(1,(FP_MODE[2] == 'R'));
LEDMOD(0,(FP_MODE[1] == 'K'));
LEDMOD(5,(FP_MODE[4] == 'H'));
}
void
fep_get_led0()
{
FP_MODE[4] = "-H"[!!(K_SFTSNS() & 0b01000000000)];
}
void
fep_ledset(UINT m)
{
register int i,mask;
m >>= 4;
for(mask=1,i=0;i<=6;i++,mask<<=1) {
LEDMOD(i,!!(m & mask));
/*
if (i == 3) {
window0();printf("[%x]",m);binkey();
}
*/
}
}
/* 何か入力があるまで待つ */
UINT
fep_INKEY_wait()
{
register UINT c;
while(!(c = fep_INKEY()));
return(c);
}
/* 待たない */
UINT
fep_INKEY()
{
register UINT c;
if (c = fep_INKEY_sub()) {
etc_click();
}
return(c);
}
/* 待たない */
UINT
fep_INKEY_sub()
{
register UINT q_func,c,c0;
register int delta;
if (DUM_FLAG) {
if (iskanji(c = INPOUT(0xff))) {
c = (c << 8) | INPOUT(0xff);
}
return(c);
}
if (q_func = fep_qxf()) { /* XF もしくはファンクションキーである */
/* etc_while_fep_qxf();*/
if ((0x200 < q_func) && (q_func < 0x210)) { /* f1 - f10 である */
/* return(fep_INKEY());*/
} else {
return(q_func);
}
}
if (c = (KNJCTRL(53) & 0xff)) {
if (iskanji(c)) {
c0 = (KNJCTRL(53) & 0xff);
c = (c << 8) | (c0 & 0xff);
fep_INKEY_0();
return(c);
} else if ((c == CR) || (c == 'M'-'@')) {
if (UNDER_FLAG) {
xf_flush_tb_r_under();
} else {
xf_flush_tb_r();
}
fep_INKEY_0();
return(c);
} else if (c == 'H'-'@') { /* bs */
if (!TBUFFC_R) { /* ローマ字の途中がない */
return(c);
}
} else { /* 普通の半角 */
fep_INKEY_0();
return(c);
}
}
return(fep_INKEY_0());
}
UINT
fep_INKEY_0()
{
if (DUM_FLAG) {
return(0);
}
/* if ((VERSION < 300) && (B_BPEEK(fep_p2) != fep_p2_last)) {*/
if (VERSION >= 300) {
if (B_BPEEK(fep_p2) != fep_p2_last) {
fep_p2_last = B_BPEEK(fep_p2);
xf_tb_r_follow();
/* xf_init_tb_r();*/
return(0x1ff);
}
xf_tb_r_follow();
/* return(0x1ff);*/
}
if (B_BPEEK(fep_p2) != fep_p2_last) {
fep_p2_last = B_BPEEK(fep_p2);
xf_tb_r_follow();
return(0x1ff);
} else {
fep_p2_last = B_BPEEK(fep_p2);
}
return(0);
}
void
fep_under_ikinari_kakutei()
{
strcat(left,right);
xf_cat_r_init(left,TBUFF_R);
right[rightc = 0] = EOS;
fep_xf_disp_left();
leftc = strlen(left);
etc_while_fep_qxf(); /* 離されるまで待つ */
}